package JavaSEAdvance.day08_Collection;

import java.util.Arrays;
import java.util.Iterator;

/**
 * @author Xiao
 * @date 2021/7/25
 */
public class MyArratList<E> implements Iterable{
    /**
     * 模拟ArrayList源码功能实现
     */
    //存储数据的容器
    private Object[] elementData = {};
    //记录元素的个数、新元素添加的索引位置
    private int size;
    public boolean add(E e) {
        if (size == elementData.length) {
            //扩容方法
            grow();
        }
        //扩容后添加元素，size++
        elementData[size++] = e;
        return true;
    }

    //扩容方法
    private void grow() {
        //新建数组，长度是原数组的1.5倍
        int newLength;
        if (elementData.length == 0) {
            newLength = 10;
        } else {
            newLength = elementData.length + elementData.length >> 1;
        }
        Object[] newArray = new Object[newLength];
        //将旧数组的元素拷贝到新数组中
        System.arraycopy(elementData, 0, newArray, 0, elementData.length);
        //elementData指向新数组
        elementData = newArray;
    }

    //获取size的方法：通过对象名调用此方法，可以获取size的值。
    public int size() {
        return size;
    }

    //get(index)方法：通过对象名调用此方法，可以获取传入索引对应的元素
    public E get(int index) {
        if (index < 0 || index > size - 1) {
            throw new IndexOutOfBoundsException();
        }
        return (E) elementData[index];
    }

    //重写toString方法
    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder("[");
        for (int i = 0; i < size; i++) {
            if (i == size - 1) {
                sb.append(elementData[i]);
            } else {
                sb.append(elementData[i]).append(", ");
            }
        }
        sb.append("]");
        return sb.toString();
    }

    //继承Iterable方法，重写iterator()方法
    // 表明这个类创建的对象是一个集合，可以在测试类中调用fori方法等
    @Override
    public Iterator iterator() {
        return null;
    }
}
